package chapter11;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author lzy
 * @create 2018-04-16 下午12:40
 */
public class ProxyBeanUtil implements InvocationHandler {

    /*被代理对象*/
    private Object target;
    /*拦截器*/
    private Interceptor interceptor;

    /**
     * 获取动态代理对象
     *
     * @param object：动态代理对象
     * @param interceptor：拦截器
     * @return 动态代理对新啊
     */
    public static Object getBean(Object object, Interceptor interceptor) {
        //使用当前类，作为代理方法，此时被代理对象执行方法的时候，会进入当前类的invoke方法里
        ProxyBeanUtil _this = new ProxyBeanUtil();
        //保存被代理对象
        _this.target = object;
        //保存拦截器
        _this.interceptor = interceptor;
        //生成代理对象，并绑定代理方法
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), _this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (interceptor == null) {
            return method.invoke(target, args);
        }
        Object result = null;
        // 是否产生异常
        boolean exceptionFlag = false;
        // before 方法
        interceptor.before(target);
        try {
            //反射原有方法
            result = method.invoke(target, args);
        } catch (Exception ex) {
            //如果出现异常则将flag置为true
            exceptionFlag = true;
        } finally {
            // after方法
            interceptor.after(target);
        }
        if (exceptionFlag) {
            //执行afterThrowing方法
            interceptor.afterThrowing(target);
        } else {
            //执行afterReturning方法
            interceptor.afterReturning(target);
        }
        return result;
    }
}
